//	COPYRIGHT (C) 1981 BY BOARD OF TRUSTEES,
//	LELAND STANFORD JUNIOR UNIVERSITY


LET NEXTFREE() = VALOF
 $( STATIC $( NXFREE = NIL $);
 NXFREE:=FIRSTFREE;
 WHILE ASSOC(NXFREE,CTELIST) NE @NULL DO NXFREE+:=1;
 RESULTIS NXFREE
 $);

LET JOIN(I,J) = VALOF
 $( STATIC $( CTE1 = NIL; CTE2 = NIL; NBRS = NIL; ANYBE = NIL $);
 CTE1:=ASSOC(I,CTELIST);
 CTE2:=ASSOC(J,CTELIST);
 NBRS:=FMEMB(I,FETCH(CTE.NBRS,CTE2));
 IF NBRS=@NULL DO
  $(
  REPLACE(CTE.NBRS,CTE1,CONS(J,FETCH(CTE.NBRS,CTE1)));
  REPLACE(CTE.NBRS,CTE2,CONS(I,FETCH(CTE.NBRS,CTE2)));
  RESULTIS TRUE
  $);
 FRPLACD(NBRS,CONS(I,CDR(NBRS)));
 NBRS:=FMEMB(J,FETCH(CTE.NBRS,CTE1));
 FRPLACD(NBRS,CONS(J,CDR(NBRS)));
 ANYBE:=ANYBENTRY(I,J);
 IF ANYBE=@NULL DO RESULTIS TRUE;
 ANYBONDS:=DREMOVE(ANYBE,ANYBONDS);
 UNCONS(ANYBE);
 RESULTIS TRUE
 $);

LET CHN(N) = VALOF
 $( STATIC $( NXFREE = NIL; PREV = NIL; ANS = NIL $);
 NXFREE:=NEXTFREE();
 ANS:=CONS(NXFREE,@NULL);
 CTELIST:=CONS(MAKECTE(NXFREE),CTELIST);
 N-:=1;
 WHILE N>0 DO
  $(
  N-:=1;
  PREV:=NXFREE;
  NXFREE:=NEXTFREE();
  CTELIST:=CONS(MAKECTE(NXFREE),CTELIST);
  JOIN(PREV,NXFREE)
  $);
 FRPLACD(ANS,NXFREE)
 RESULTIS ANS
 $);

LET CHAIN(N) = VALOF
 $(
 UNCONS(CHN(N));
 RESULTIS TRUE
 $);

LET RING(N) = VALOF
 $( STATIC $( ENDS = NIL $);
 ENDS:=CHN(N);
 JOIN(CAR(ENDS),CDR(ENDS));
 UNCONS(ENDS);
 RESULTIS TRUE
 $);

LET LINK(I,J,N) = VALOF
 $( STATIC $( ENDS = NIL $);
 TEST N=0 THEN JOIN(I,J)
 OR
  $(
  ENDS:=CHN(N);
  JOIN(I,CAR(ENDS));
  JOIN(J,CDR(ENDS));
  UNCONS(ENDS)
  $);
 RESULTIS TRUE
 $);

LET BRANCH(I,N) = VALOF
 $( STATIC $( ENDS = NIL $);
 ENDS:=CHN(N);
 JOIN(I,CAR(ENDS));
 UNCONS(ENDS)
 RESULTIS TRUE
 $);

LET UNJOIN(I,J) = VALOF
 $( STATIC $( CTEI = NIL; CTEJ = NIL; NBRS = NIL; TEM = NIL $);
 CTEI:=ASSOC(I,CTELIST);
 CTEJ:=ASSOC(J,CTELIST);
 NBRS:=FMEMB(J,FETCH(CTE.NBRS,CTEI));
 IF NBRS=@NULL DO RESULTIS FALSE;
 IF CAR(CDR(NBRS))=J DO
  $(
  TEM:=CDR(NBRS);
  FRPLACD(NBRS,CDR(TEM));
  UNCONS(TEM);
  NBRS:=FMEMB(I,FETCH(CTE.NBRS,CTEJ));
  TEM:=CDR(NBRS);
  FRPLACD(NBRS,CDR(TEM));
  UNCONS(TEM);
  RESULTIS TRUE
  $);
 REPLACE(CTE.NBRS,CTEI,DREMOVE(J,FETCH(CTE.NBRS,CTEI)));
 REPLACE(CTE.NBRS,CTEJ,DREMOVE(I,FETCH(CTE.NBRS,CTEJ)));
 TEM:=ANYBENTRY(I,J);
 IF TEM=@NULL DO RESULTIS TRUE;
 ANYBONDS:=DREMOVE(TEM,ANYBONDS);
 UNCONS(TEM);
 RESULTIS TRUE
 $);

LET BORD(I,J,BO) = VALOF
 $(
 WHILE UNJOIN(I,J) DO;
 IF BO<0 DO
  $(
  BO:=-BO;
  ANYBONDS:=(I>J -> CONS(CONS(I,J),ANYBONDS),CONS(CONS(J,I),ANYBONDS))
  $);
 WHILE BO>0 DO $( BO-:=1; JOIN(I,J) $);
 RESULTIS TRUE
 $);

LET FREEV(I,N) = VALOF
 $( STATIC $( CTE = NIL $);
 CTE:=ASSOC(I,CTELIST);
 REPLACE(CTE.NBRS,CTE,
         NCONC(DREMOVE(0,FETCH(CTE.NBRS,CTE)),LISTOF(N,0)));
 RESULTIS TRUE
 $);

LET PUTMARK(I,MARK) BE
  $( STATIC $( CTE = NIL $);
 CTE:=ASSOC(I,CTELIST);
 REPLACE(CTE.MARKS,CTE,[MARK BITOR FETCH(CTE.MARKS,CTE)])
 $);

LET REMMARK(I,MARK) BE
 $( STATIC $( CTE = NIL; MARKS = NIL $);
 CTE:=ASSOC(I,CTELIST);
 MARKS:=MARK BITOR FETCH(CTE.MARKS,CTE);
 REPLACE(CTE.MARKS,CTE,[MARKS NEQV MARK])
 $);

LET TAG(I) = VALOF $( PUTMARK(I,TAGMARK); RESULTIS TRUE $);

LET UNTAG(I) = VALOF $( REMMARK(I,TAGMARK); RESULTIS TRUE $);

LET AROM(I) = VALOF
 $( REMMARK(I,NONARMARK); PUTMARK(I,ARMARK) RESULTIS TRUE $);

LET NONAROM(I) = VALOF
 $( PUTMARK(I,NONARMARK); REMMARK(I,ARMARK) RESULTIS TRUE $);

LET ERASEAROM(I) = VALOF
 $( REMMARK(I,NONARMARK); REMMARK(I,ARMARK); RESULTIS TRUE $);

LET ERASECONFIG(I) = VALOF
 $( REMMARK(I,CONFIG1MARK); REMMARK(I,CONFIG0MARK); RESULTIS TRUE $);

LET ERASEHYBRID(I) = VALOF
 $( REMMARK(I,SP3MARK); REMMARK(I,SP2MARK); 
    REMMARK(I,SP1AMARK); REMMARK(I,SP1BMARK); RESULTIS TRUE $);

LET CONFIG1(I) = VALOF
  $( REMMARK(I,CONFIG0MARK); PUTMARK(I,CONFIG1MARK); RESULTIS TRUE $);

LET CONFIG0(I) = VALOF
  $( REMMARK(I,CONFIG1MARK); PUTMARK(I,CONFIG0MARK); RESULTIS TRUE $);

LET CONFIGE(I) = VALOF
  $( PUTMARK(I,CONFIG1MARK); PUTMARK(I,CONFIG0MARK); RESULTIS TRUE $);

LET HRANGE(I,N1,N2) = VALOF
 $(
 REPLND2(FETCH(CTE.HR,ASSOC(I,CTELIST)),N1,N2);
 RESULTIS TRUE
 $);

LET LNODE(I,N1,N2) = VALOF
 $(
 IF N1<0 DO $( N1:=1; N2:=0 $);
 REPLND2(FETCH(CTE.LR,ASSOC(I,CTELIST)),N1,N2);
 RESULTIS TRUE
 $);

LET DELAT(I) = VALOF
 $( STATIC $( CTE = NIL; NBRS = NIL $);
 FREEV(I,0);
 CTE:=ASSOC(I,CTELIST);
 NBRS:=FETCH(CTE.NBRS,CTE);
 WHILE NBRS NE @NULL DO
  $(
  UNJOIN(I,CAR(NBRS));
  NBRS:=FETCH(CTE.NBRS,CTE)
  $);
 CTELIST:=DREMOVE(CTE,CTELIST);
 UNMAKECTE(CTE);
 RESULTIS TRUE
 $);

LET ATNAME(I,ATS) = VALOF
 $( STATIC $( CTE = NIL $);
 CTE:=ASSOC(I,CTELIST);
 UNLIST(FETCH(CTE.ATS,CTE));
 REPLACE(CTE.ATS,CTE,ATS);
 RESULTIS TRUE
 $);
